/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package data;

import java.util.ArrayList;
import java.util.Hashtable;
import org.apache.log4j.Logger;

/**
 *
 * @author Groep 5
 */
public class Gameroom {

    public Hashtable<String, Integer> getScores() {
        return scores;
    }

    public void setScores(Hashtable<String, Integer> scores) {
        this.scores = scores;
    }

    public boolean isSpelGestart() {
        return spelGestart;
    }

    public void setSpelGestart(boolean spelGestart) {
        this.spelGestart = spelGestart;
    }

    public int getTijdPerBeurtInSeconden() {
        return tijdPerBeurtInSeconden;
    }

    public void setTijdPerBeurtInSeconden(int tijdPerBeurtInSeconden) {
        this.tijdPerBeurtInSeconden = tijdPerBeurtInSeconden;
    }

    public int getMaxAantalKeerGepast() {
        return maxAantalKeerGepast;
    }

    public void setMaxAantalKeerGepast(int maxAantalKeerGepast) {
        this.maxAantalKeerGepast = maxAantalKeerGepast;
    }

    public Hashtable<String, Integer> getAantalKeerGepastPerSpeler() {
        return aantalKeerGepastPerSpeler;
    }

    public void setAantalKeerGepastPerSpeler(Hashtable<String, Integer> aantalKeerGepastPerSpeler) {
        this.aantalKeerGepastPerSpeler = aantalKeerGepastPerSpeler;
    }

    public boolean isSpelAfgelopen() {
        return spelAfgelopen;
    }

    public void setSpelAfgelopen(boolean spelAfgelopen) {
        this.spelAfgelopen = spelAfgelopen;
    }

    public String getGebruikerAanDeBeurt() {
        return gebruikerAanDeBeurt;
    }

    public void setGebruikerAanDeBeurt(String gebruikerAanDeBeurt) {
        this.gebruikerAanDeBeurt = gebruikerAanDeBeurt;
    }

    public int getAantalSpelersGeantwoord() {
        return aantalSpelersGeantwoord;
    }

    public void setAantalSpelersGeantwoord(int aantalSpelersGeantwoord) {
        this.aantalSpelersGeantwoord = aantalSpelersGeantwoord;
    }

    public int getMaxAantalKeerBeurtVerlopen() {
        return maxAantalKeerBeurtVerlopen;
    }

    public void setMaxAantalKeerBeurtVerlopen(int maxAantalKeerBeurtVerlopen) {
        this.maxAantalKeerBeurtVerlopen = maxAantalKeerBeurtVerlopen;
    }

    public Hashtable<String, Integer> getAantalKeerBeurtVerlopenPerSpeler() {
        return aantalKeerBeurtVerlopenPerSpeler;
    }

    public void setAantalKeerBeurtVerlopenPerSpeler(Hashtable<String, Integer> aantalKeerBeurtVerlopenPerSpeler) {
        this.aantalKeerBeurtVerlopenPerSpeler = aantalKeerBeurtVerlopenPerSpeler;
    }

    public int getBeurtIndex() {
        return beurtIndex;
    }

    public void setBeurtIndex(int beurtIndex) {
        this.beurtIndex = beurtIndex;
    }

    public enum Gametype {

        SCRABBLE,
        BOGGLE,
        GALGJE
    }
    private Logger logger = Logger.getLogger(Gameroom.class);
    private Hashtable<String, Gebruiker> spelers = new Hashtable<String, Gebruiker>();
    private Hashtable<String, Integer> scores = new Hashtable<String, Integer>();
    private Hashtable<String, Integer> aantalKeerGepastPerSpeler = new Hashtable<String, Integer>();
    private Hashtable<String, Integer> aantalKeerBeurtVerlopenPerSpeler = new Hashtable<String, Integer>();
    private ArrayList<Gebruiker> beurt = new ArrayList<Gebruiker>();
    private String paswoord;
    private int beurtIndex = 0;
    private int aantalSpelersGeantwoord = 0;
    private String gamenaam;
    private String nicknameOprichter;
    private int maxAantalSpelers;
    private int maxAantalKeerGepast;
    private int maxAantalKeerBeurtVerlopen;
    private int tijdPerBeurtInSeconden;
    Gametype type;
    private boolean spelGestart = false;
    private boolean spelAfgelopen = false;
    private String gebruikerAanDeBeurt = null;

    public Gameroom(String gameNaam) {
        this.gamenaam = gameNaam;

    }

    public Gameroom() {

    }

    public void setType(Gametype type) {
        this.type = type;
    }

    public Gametype getType() {
        return type;
    }

    public String toString() {
        return getGamenaam();
    }

    public void setGamenaam(String gamenaam) {
        this.gamenaam = gamenaam;
    }

    public void setPaswoord(String paswoord) {
        this.paswoord = paswoord;
    }

    public String convertToXML() {
        String lijn = "<gameroom>" +
                "<gameNaam>" + getGamenaam() + "</gameNaam>" +
                "<nicknameOprichter>" + getNicknameOprichter() + "</nicknameOprichter>" +
                "<spelType>" + getType().toString() + "</spelType>" +
                "<passwordGameroom>" + getPaswoord() + "</passwordGameroom>" +
                "<maxAantalSpelers>" + getMaxAantalSpelers() + "</maxAantalSpelers>" +
                "<maxTijdPerBeurt>"+getTijdPerBeurtInSeconden()+"</maxTijdPerBeurt>" +
                "<maxAantalKeerGepast>" + getMaxAantalKeerGepast() + "</maxAantalKeerGepast>" + 
                "<maxAantalKeerBeurtVerlopen>" + getMaxAantalKeerBeurtVerlopen() + "</maxAantalKeerBeurtVerlopen>" +
                "<spelGestart>" + isSpelGestart() + "</spelGestart>" + 
                "<gebruikers>";

        for (String key : getSpelers().keySet()) {
            lijn += getSpelers().get(key).convertToXML();
        }

        lijn += "</gebruikers></gameroom>";

        return lijn;
    }

    public void addSpelers(Gebruiker g) {
        getSpelers().put(g.getNickname(), g);
        beurt.add(g);
        addScore(g.getNickname(), 0);
        setAantalKeerGepastPerSpeler(g.getNickname(), 0);
        setAantalKeerBeurtVerlopenPerSpeler(g.getNickname(), 0);
    }

    public void removeSpelers(Gebruiker g) {
        getSpelers().remove(g.getNickname());
        Gebruiker teVerwijderen = null;
        for (Gebruiker speler : beurt) {
            if (speler.getNickname().equals(g.getNickname())) {
                teVerwijderen = speler;
            }
        }
        beurt.remove(teVerwijderen);
        getScores().remove(g.getNickname());
        getAantalKeerGepastPerSpeler().remove(g.getNickname());
        getAantalKeerBeurtVerlopenPerSpeler().remove(g.getNickname());
    }
    
    public ArrayList<String> bepaalWinnaars(){
        ArrayList<String> winnaars = new ArrayList<String>();
        
        String winnaar = getScores().keys().nextElement();
        
        for(String nickname : getScores().keySet()){
            if(getScores().get(nickname).intValue()>getScores().get(winnaar).intValue()){
                winnaar = nickname;
            }
        }
        
        for(String nickname : getScores().keySet()){
            if(getScores().get(nickname).intValue()==getScores().get(winnaar).intValue()){
                winnaars.add(nickname);
            }
        }
        
        return winnaars;
    }
    
    public void setAantalKeerGepastPerSpeler(String nickname, int aantal){
        getAantalKeerGepastPerSpeler().put(nickname, aantal);
    }
    
    public void setAantalKeerBeurtVerlopenPerSpeler(String nickname, int aantal){
        getAantalKeerBeurtVerlopenPerSpeler().put(nickname, aantal);
    }

    public void addScore(String nickname, int score) {
        getScores().put(nickname, new Integer(score));
    }

    public void setNicknameOprichter(String nickname) {
        this.nicknameOprichter = nickname;
    }

    public String getNicknameOprichter() {
        return this.nicknameOprichter;
    }

    public String getGamenaam() {
        return gamenaam;
    }

    public String getPaswoord() {
        return paswoord;
    }

    public int getAantalSpelers() {
        return getSpelers().size();
    }

    public Hashtable<String, Gebruiker> getSpelers() {
        return spelers;
    }

    public int getMaxAantalSpelers() {
        return maxAantalSpelers;
    }

    public void setMaxAantalSpelers(int maxAantalSpelers) {
        this.maxAantalSpelers = maxAantalSpelers;
    }

    public String getVolgendeSpeler() {
        //de volgende speler wordt hier teruggegeven geen idee hoe juist?!?
        if (getAantalSpelers() == 0) {
            return null;
        } else {
            Gebruiker volgende = null;
            do {
                if (getBeurtIndex() + 1 >= getAantalSpelers()) {
                    setBeurtIndex(0);
                } else {
                    setBeurtIndex(getBeurtIndex() + 1);
                }
                volgende = beurt.get(getBeurtIndex());
            } while (volgende == null);

            logger.info("de volgende speler is: " + volgende.getNickname());
            return volgende.getNickname();
        }
    }
    /*
    public Gebruiker[] getSpelers() {
    return spelers;
    }
     */
}
